//
//  WBStatusViewModel.swift
//  TYCWeiBo
//
//  Created by 中发 on 2018/6/11.
//  Copyright © 2018年 中发. All rights reserved.
//

import Foundation

/// 单条微博的数据模型
/**
    如果没有任何父类，如果希望在开发时调试，输出调试形象，需要：
        准守CustomStringConvertible
        实现description计算型属性
 
 关于表格数据的优化：
        尽量减少计算，所有需要的素材提前准备好
        控件上不要设置半径圆角，所有图像渲染的属性，都要注意
        不要动态创建控件，所有需要的控件都要提前准备好，在显示的时候根据数据隐藏/显示
        cell中控件的层次越少越好，数量越少越好
        要测量，不要猜测
 */

class WBStatusViewModel:CustomStringConvertible {
    
    /// 微博模型
    var status: WBStatus
    /// 会员图标，存储型属性（用内存换CPU）
    var memberIcon: UIImage?
    /// 认证类型：-1.从没有认证0.认证用户，2，3，5企业，220达人
    var vipIcon: UIImage?
    
    
    
    
    /// 转发文字
    var retweetedStr: String?
    /// 评论文字
    var commentStr: String?
    /// 赞文字
    var likeStr: String?
    /// 配图视图大小
    var pictureViewSize = CGSize()
    /// 如果是被转发的微博，原创微博一定没有图
    var picURLs: [WBStatusPicture]? {
        //如果有被转发的微博，返回被转发的微博的配图
        //如果没有被转发的微博，返回原创微博的配图
        //如果都没有，返回nil
        return status.retweeted_status?.pic_urls ?? status.pic_urls
    }
    /// 微博正文属性文本
    var statusAttrText: NSAttributedString?
    /// 转发文字的属性文本
    var retweetedAttrText: NSAttributedString?
    /// 行高
    var rowHeight: CGFloat = 0
    
    
    /// 构造行数
    ///
    /// - Parameter model: 微博模型
    init(model: WBStatus) {
        self.status = model
        //直接计算出会员图标（会员等级0-6）
        if (model.user?.mbrank)! > 0 && (model.user?.mbrank)! < 7 {
            let imageName = "common_icon_membership_level\((model.user?.mbrank)!)"
            memberIcon = UIImage(named: imageName)
        }
        //认证图标
        switch model.user?.verified_type ?? -1 {
        case 0:
            vipIcon = UIImage(named: "avatar_vip")
        case 2,3,5:
            vipIcon = UIImage(named: "avatar_enterprise_vip")
        case 220:
            vipIcon = UIImage(named: "avatar_grassroot")
        default:
            break
        }
        //设置底部计数字符串
        //测试超过10000的数字
//        model.comments_count = Int(arc4random_uniform(100000))
        retweetedStr = countString(count: model.reposts_count, defaultStr: "转发")
        commentStr = countString(count: model.comments_count, defaultStr: "评论")
        likeStr = countString(count: model.attitudes_count, defaultStr: "赞")
        //计算配图视图大小(有原创的就计算原创的，有转发的就计算转发的)
        pictureViewSize = calcPictureViewSize(count: picURLs?.count)
        /// 设置微博文本
        let originFont = UIFont.systemFont(ofSize: 15)
        let retweetedFont = UIFont.systemFont(ofSize: 14)
        
        //微博正文的属性文本
        statusAttrText = TYCEmoticonManager.share.emoticonString(string: model.text ?? "", font: originFont)
        
        //设置被转发微博的文字
        let rText = "@" + (status.retweeted_status?.user?.screen_name ?? "") + ":"
        retweetedAttrText = TYCEmoticonManager.share.emoticonString(string: rText, font: retweetedFont)
//          retweetedText += status.retweeted_status?.text ?? ""
        
        //计算杭高
        updateRowHeight()
    }
    var description: String{
        return status.description
    }
    
    func updateRowHeight() {
        let margin: CGFloat = 12
        let iconHeight: CGFloat = 12
        let toolBarHeight: CGFloat = 12
        var height: CGFloat = 0
        let viewSize = CGSize(width: UIScreen.main.bounds.width - 2 * margin, height: CGFloat(MAXFLOAT))
        //计算顶部的位置
        height = 2 * margin + iconHeight + margin
        //正文高度
        if let text = statusAttrText {
             height += text.boundingRect(with: viewSize, options: [.usesLineFragmentOrigin], context: nil).height
        }
        //判断是否是转发微博
        if status.retweeted_status != nil {
            height += 2 * margin
            //转发文本 的高度，一定用retweetedText，拼接了@用户名：微博文字
            if let text = retweetedAttrText {
                height += text.boundingRect(with: viewSize, options: [.usesLineFragmentOrigin], context: nil).height
            }
        }
        //匹配视图
        height += pictureViewSize.height
        height += margin
        //底部工具栏
        height += toolBarHeight
        //使用属性记录
        rowHeight = height
    }
    
    
    /// 使用单个视图图像，更新配图视图的大小
    ///
    /// - Parameter image: 网络缓存的单张图片
    func updataSingleImageSize(image: UIImage) {
        var size = image.size
        //过宽图像处理
        let maxkWidth: CGFloat = 300
        let mimWidth: CGFloat = 40
        if size.width > maxkWidth {
            //设置最大宽度
            size.width = maxkWidth
            //等比例调整高度
            size.height = size.width * image.size.height / image.size.width
        }
        
        if size.width > mimWidth {
            //设置最大宽度
            size.width = mimWidth
            //等比例调整高度
            size.height = size.width * image.size.height / image.size.width / 4
        }
        //注意：寸尺需要增加顶部的12个点，便于布局
        size.height += WBStatusViewOutterMargin
        //  重新设置视图配图大小
        pictureViewSize = size
        //更新行高
        updateRowHeight()
    }
    /// 给定一个数字，返回对应的描述结果
    ///
    /// - Parameters:
    ///   - count: 数字
    ///   - defaultStr: 默认字符串，评论/转发/赞
    /// - Returns: 描述结果
    private func countString(count: Int, defaultStr: String) -> String {
        
        if count == 0 {
            return defaultStr
        }
        if count < 10000 {
            return count.description
        }
        return String(format: "%0.2f 万", Double(count) / 10000)
    }
    
    /// 计算指定数量的图片对应的配图视图的大小
    ///
    /// - Parameter count: 配图数量
    /// - Returns: 配图视图的大小
    private func calcPictureViewSize(count: Int?) -> CGSize {
        if count == 0 || count == nil {
            return CGSize()
        }
        //计算配图视图的宽度
        
        //计算高度
        //根据count知道行数1-9
        let row = (count! - 1) / 3 + 1
        var height = WBStatusViewOutterMargin
        height += CGFloat(row) * WBStatusViewItemWidth
        height += CGFloat(row - 1) * WBStatusViewInnerMargin
        
        
        
        return CGSize(width: 100, height: 200)
    }
}
